#include <iostream>
#include <string>

using namespace std;

// Complex 类表示复数
class Complex
{
private:
    double real;  // 复数的实部
    double imag;  // 复数的虚部

public:
    // 默认构造函数，初始化实部和虚部为0
    Complex(/* args */) : real(0), imag(0)
    {
        // 这里不需要做额外的操作，实部和虚部已在初始化列表中设为0
    }

    // 带参数的构造函数，初始化实部和虚部
    Complex(double real, double imag)
        : real(real), imag(imag)
    {
        // 通过初始化列表将参数赋值给实部和虚部
    }

    // 析构函数，不需要做额外清理操作，默认析构即可
    ~Complex()
    {
    }

public:
    // 显示复数的实部和虚部
    void show()
    {
        cout << "实部" << real << "虚部" << imag << endl;  // 输出复数的实部和虚部
    }

public:
    // 重载函数调用运算符 "()"
    // 当调用 Complex 对象时，直接输出复数的实部和虚部
    void operator()()
    {
        cout << "实部" << real << "虚部" << imag << endl;  // 输出复数的实部和虚部
    }

    // 重载函数调用运算符 "()"
    // 当调用 Complex 对象并传入另一个 Complex 对象时，输出当前复数和传入复数的实部和虚部
    void operator()(Complex &O)
    {
        cout << "实部" << real << "虚部" << imag << endl;  // 输出当前复数的实部和虚部
        cout << "实部" << O.real << "虚部" << O.imag << endl;  // 输出传入复数 O 的实部和虚部
    }

    // 重载函数调用运算符 "()"
    // 当调用 Complex 对象并传入字符串时，输出复数的实部和虚部，并附上字符串内容
    void operator()(char *str)
    {
        cout << str << "的 实部" << real << " 虚部" << imag << endl;  // 输出指定字符串的名称以及复数的实部和虚部
    }
};

int main(int argc, char const *argv[])
{
    // 创建两个复数对象 F1 和 F2，分别初始化为 (10, 20) 和 (80, 90)
    Complex F1(10, 20);
    Complex F2(80, 90);

    // 调用 F1 的重载 "()" 运算符，传入字符串 "F1"
    F1();
    F1("F1");  // 输出 "F1的 实部10 虚部20"
    F1(F2);

    return 0;  // 程序结束
}

/*
Complex 类：

私有成员：real 和 imag 分别表示复数的实部和虚部。
构造函数：
默认构造函数将实部和虚部初始化为 0。
带参数构造函数接受实部和虚部的值进行初始化。
析构函数：没有需要特别清理的资源，因此可以使用默认的析构函数。
成员函数 show()：

用于显示复数的实部和虚部。使用 cout 输出复数的实部和虚部。
重载函数调用运算符 ()：

operator()()：无参数调用时，直接输出当前复数的实部和虚部。
operator()(Complex &O)：当调用对象时传入另一个 Complex 类型对象，会输出当前复数和传入复数的实部和虚部。
operator()(char *str)：当调用对象时传入一个字符串，输出字符串内容和复数的实部与虚部。
*/